/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.vistes;

import edu.uoc.tfc.exuoc.controladors.AbstractInGestor;
import edu.uoc.tfc.exuoc.controladors.GestorItems;
import edu.uoc.tfc.exuoc.controladors.GestorContenidors;
import edu.uoc.tfc.exuoc.controladors.GestorMetadades;
import edu.uoc.tfc.exuoc.controladors.GestorArxiuDades;
//import edu.uoc.tfc.exuoc.controladors.GestorArxiuDades;
import edu.uoc.tfc.exuoc.errors.BuitException;
import edu.uoc.tfc.exuoc.errors.LlegirDAOException;
import edu.uoc.tfc.exuoc.errors.ModDAOException;
import edu.uoc.tfc.exuoc.errors.EliDAOException;
import edu.uoc.tfc.exuoc.errors.AfegirDAOException;
import edu.uoc.tfc.exuoc.errors.LlistatDAOException;
import edu.uoc.tfc.exuoc.errors.NoExisteixException;

import edu.uoc.tfc.exuoc.utils.Eines;
import edu.uoc.tfc.exuoc.utils.seguretat.InjeccioCodi;
import edu.uoc.tfc.exuoc.config.Config;
import edu.uoc.tfc.exuoc.model.InterfaceItem;
import edu.uoc.tfc.exuoc.model.Item;
import edu.uoc.tfc.exuoc.model.MetaDC;
import edu.uoc.tfc.exuoc.model.Arxiu;
import edu.uoc.tfc.exuoc.model.Contenidor;
import edu.uoc.tfc.exuoc.consultes.ItemLlistat;
import edu.uoc.tfc.exuoc.consultes.ContenidorLlistat;

import java.io.File;
import java.util.Date;


import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.ActionSupport;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import org.hibernate.HibernateException;

/**
 *
 * @author Emili A. Moreno Ruiz
 */
public class IGestorItems extends AbstractInGestor
            implements  ModelDriven<InterfaceItem>{

    //Entitat gestionada
    private Item item=null;
    private Long idItemActual=Config.valorNull;

    //Entitat contenidora
    private Long idContenidorActual=Config.valorNull;
    private GestorItems giI =null;

    private Contenidor contenidor=null;
    private MetaDC  metaDC=null;

    //Paquet del TFC
    private Arxiu arxiu=null;
    //Dades que necessita l'struts per retornar l'arxiu
    private File arxiuDades=null;
    private String arxiuDadesFileName=null;
    private String arxiuDadesContentType=null;

    private List<ItemLlistat>  llistaIt = new ArrayList<ItemLlistat>();

    //Per crear la llista de Metadades
    private Iterator<MetaDC> llistaDC=null;

    //Per la llista de multiples entrades DC
    private String dc[];
    private String dcValor[];

    private Iterator<Contenidor> llistaContenidors=null;

    private int nItems=0;

    private int itemsPerPagina=Config.ITEM_PAGE+2;
    private int pos=0;


    //private Arxiu arxiu=null;
    


    @Override
    public Item getModel() {
        return item;
    }
    public void setModel( Item _item) {
        this.item=_item;

    }

/*Emili:05-01-2012:1:private String nomArxiu =Config.valorNullStr;
    public String getNomArxiu() {
        return nomArxiu;
    }

    public void setNomArxiu(String nomArxiu) {
        this.nomArxiu = nomArxiu;
    }
*/


    public Long getIdItemActual() {
        return idItemActual;
    }

    public void setIdItemActual(Long idItemActual) {
        this.idItemActual = idItemActual;
    }



    public Long getIdContenidorActual() {
        return idContenidorActual;
    }

    public void setIdContenidorActual(Long idContenidorActual) {
        this.idContenidorActual = idContenidorActual;
    }

        /*Emili:05-01-2012:1:
    public String getIdSessio() {
        return idSessio;
    }

    public void setIdSessio(String idSessio) {
        this.idSessio = idSessio;
    }
     *
         * */
    /*public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }
*/
    public Contenidor getContenidor() {
        return contenidor;
    }

    public void setContenidor(Contenidor _contenidor) {
        this.contenidor = _contenidor;
    }

    public MetaDC getMetaDC() {
        return metaDC;
    }

    public void setMetaDC(MetaDC metaDC) {
        this.metaDC = metaDC;
    }

    public String[] getDc() {
        return dc;
    }

    public void setDc(String[] dc) {
        this.dc = dc;
    }

    public String[] getDcValor() {
        return dcValor;
    }

    public void setDcValor(String[] dcValor) {
        this.dcValor = dcValor;
    }

    public Arxiu getArxiu() {
        return arxiu;
    }

    public void setArxiu(Arxiu arxiu) {
        this.arxiu = arxiu;
    }
    public File getArxiuDades() {        return arxiuDades;    }

    public void setArxiuDades(File arxiuDades) { this.arxiuDades = arxiuDades; }
public String getArxiuDadesContentType() { return arxiuDadesContentType; }

    public void setArxiuDadesContentType(String arxiuDadesContentType) {
        this.arxiuDadesContentType = arxiuDadesContentType;
    }

    public String getArxiuDadesFileName() { return arxiuDadesFileName; }

    public void setArxiuDadesFileName(String arxiuDadesFileName) {
        this.arxiuDadesFileName = arxiuDadesFileName;
    }

 /*Emili:05-01-2012:1:
    public int getQuants() {
        return quants;
    }

    public void setQuants(int quants) {
        this.quants = quants;
    }
*/
    public int getNItems() {

        return this.nItems;
    }

 public void setNItems(int _nItems) {
        this.nItems = _nItems;
    }

    public int getItemsPerPagina() {
        return itemsPerPagina;
    }

    public void setItemsPerPagina(int itemsPerPagina) {
        this.itemsPerPagina = itemsPerPagina;
    }

    public int getPos() {
        return pos;
    }

    public void setPos(int pos) {
        //Emili:05-01-2012:1:this.pos = pos;
         InjeccioCodi filtre=new InjeccioCodi();
        this.pos = Integer.parseInt(filtre.netejar(pos));
    }

    public List<ItemLlistat> getLlistaIt() {
        return llistaIt;
    }

    public void setLlistaIt(List<ItemLlistat> llistaIt) {
        this.llistaIt = llistaIt;
    }

    /*Emili:05-01-2012:1:
     public void setLlistaCon(List<ContenidorLlistat> _llistaCon) {
        this.llistaCon = _llistaCon;
    }

    public List<ContenidorLlistat> getLlistaCon() {
        return llistaCon;
    }
     * 
     */
     public Iterator<Contenidor> getLlistaContenidors() {
        return llistaContenidors;
    }

    public void setLlistaContenidors(Iterator<Contenidor> llistaCon) {
        this.llistaContenidors = llistaCon;
    }


     public Iterator<MetaDC> getLlistaDC() {
        return llistaDC;
    }

    public void setLlistaDC(Iterator<MetaDC> _llistaDC) {
        this.llistaDC = _llistaDC;
    }

   /*Emili:05-01-2012:1: public IGestorItems(){
      //  this.openGestor();
        }
*/
    private void openGestor(){

/*        if (this.gi==null)
            gi=new GestorItems();
 */
        giI=GestorItems.getInstance();
    }

    private void closeGestor(){
        try{
//            giI.tancar();
//            giI=null;
            giI.tancar();
            giI=null;
            
        }catch(HibernateException e){
           this.getLog().error("IGI:closeGestor: Hi ha hagut un error "
                   +"realitzant el tancament del Gestor. "
                   +e.getLocalizedMessage());
        }catch (NullPointerException e){
            this.getLog().info("IGI:closeGestor:Gestor d'ítems ja tancat");
        }
    }


    /*public GestorLogs getLog() {
        return log;
    }

    public void setLog(GestorLogs log) {
        this.log = log;
    }*/


    /* public Arxiu getArxiu() {
        return arxiu;
    }

    public void setArxiu(Arxiu arxiu) {
        this.arxiu = arxiu;
    }*/

    /*

    public String getNomArxiu() {
        return nomArxiu;
    }

    public void setNomArxiu(String nomArxiu) {
        this.nomArxiu = nomArxiu;
    }

*/

 /*    private void openGestor(){

        if (this.gi==null)
            gi=new GestorItems();
    }

     private void closeGestor(){
        if (this.gi!=null){
            gi.tancar();
            gi=null;}
    }*/

    
  

    @Override
    public void prepare() {
        super.prepare();
        this.openGestor();
        
/*        if (this.getDc()!=null) {
            for (int i=0;i<getDc().length;i++){
                getLog().info("dc :"+dc[i].toString());
                getLog().info("dcValor :"+dcValor[i].toString());
            }

        }*/
        //GestorItems gi = new GestorItems();
        if (this.getLlistaContenidors()==null){
            omplirllistatContenidors();
        }

        /* Emili:05-01-2012:1: try {
            this.setQuants(gi.numItems());
        } catch (HibernateException ex) {
            this.getLog().error("IGI:prepare: num items error");
        } catch (BuitException ex) {
            this.getLog().error("IGI:prepare: num items buit");
        }
        GestorContenidors gc=null;
         *
         */
        try {
        
            //Preparar l'ítem, si cal
            //Emili:05-01-2012:Item i=null;
            //Emili:05-01-2012:Contenidor c=null;
            //InjeccioCodi filtre = new InjeccioCodi();
           // this.setIdItemActual(this.getIdItemActual());

            //Emplenem la llista de etiquetes dublin core
            this.omplirllistatDC();
            getLog().info("idItemActual:"+idItemActual);
            if (this.idItemActual.equals(Config.valorNull) ||
                this.idItemActual==null){
               item= new Item();
            }else{

                try{
                //Emili:05-01-2012:i=(Item)gi.llegirItem(this.getIdItemActual());
                    item=(Item)GestorItems.getInstance().llegir(idItemActual);
                }catch(LlegirDAOException e) {
                 this.getLog().error("IGI:prepare: No existeix. item id: "
                         +this.idItemActual);
                }
                // si no s'ha trobat l'ítem es guarda un avís
                if (item==null){
                    this.getLog().error("Item no trobat id: "
                            +this.getIdItemActual());
                    item= new Item();
                }
            }            
/*            //Preparar el contenidor, si cal.
            this.getLog().info("conte:"+this.getIdContenidorActual());
            if (this.idContenidorActual.equals(Config.valorNull) ||
                    this.idContenidorActual==null ){
                c= new Contenidor();
            }else{

                gc = GestorContenidors.getInstance();
                c=gc.llegirContenidor(this.getIdContenidorActual());

                // si no s'ha trobat el contenidor es guarda un avís
                this.getLog().info("prepare:  c="+c.toString());
                if (c==null){
                    this.getLog().error("Contenidor no trobat id: "+this.getIdContenidorActual());

                }else {
                    this.setContenidor(c);
                    c=null;
                }
                //gi.tancar();
                //if (gc!=null) gc.tancar();
            }
            */
        }catch (NullPointerException e){
            if (this.getIdItemActual()==null)
                this.getLog().error("idItemActual null, Actual :");
            if (this.item==null)this.getLog()
                    .error("Item null."+e.getLocalizedMessage());
            //if (gc!=null) gc.tancar();
        }/*catch (LlegirDAOException e){
            if (this.getIdItemActual()==null) this.getLog().error("idItemActual, No existeix l'ítem.{}",e.getLocalizedMessage());
            if (this.item==null)this.getLog().error("Item no existeix.",e.getLocalizedMessage());
            //if (gc!=null) gc.tancar();
        }finally{
            if (gc!=null){
                gc.tancar();
                gc=null;
            }
            if (gi!=null){
                gi.tancar();
                gi=null;
            }*/
      
        //this.closeGestor();
    }


    @Override
    public String execute() {
        return SUCCESS;
    }
    public String editar(){
        return this.afegir();
    }

    /**
     * Mètode que contectarà amb el gestor de metadades per obtenir les dades
     * Dublinc Core (DC)
     * @return
     */
    public String editarDC(){
        if (this.getIdContenidorActual()==null ||
                this.getIdContenidorActual()==Config.valorNull ){
            this.getLog().info("IGI:EditarDC: Falta l'id del contenidor, per "
                    +"afegir un ítem");
            addActionError("IGI:EditarDC: Falta l'identificador del contenidor");
            return ActionSupport.ERROR;
        }
        this.openGestor();
        if (this.getLlistaDC()==null){
            omplirllistatDC();
        }
        return Config.JSP_DC;
    }

    public String editarArxiu(){
        if (this.getIdContenidorActual()==null ||
                this.getIdContenidorActual()==Config.valorNull ){
            this.getLog().info("IGI:Afegir: Falta l'id del contenidor, per "
                    +"afegir un ítem");
            addActionError("IGI:Afegir: Falta l'identificador del contenidor");
            return ActionSupport.ERROR;
        }
        return Config.JSP_ARXIU;
    }

    public String afegir(){
        if (this.getIdContenidorActual()==null ||
                this.getIdContenidorActual()==Config.valorNull ){
            this.getLog().info("IGI:Afegir: Falta l'id del contenidor, per "
                    +"afegir un ítem");
            addActionError("IGI:Afegir: Falta l'identificador del contenidor");
            return ActionSupport.ERROR;
        }
        //Es busquen les dades dels arxius per ensenyar les dades
        //DESACTIVAT FINS A QUE EL GESTOR ESTIGUI ACTIU
        //generarArxius();
        return ActionSupport.INPUT;
    }

    /**
     * Acció que recull totes les dades dels forms de dades , DC i Arxiu i genera
     * l'objecte Item persistent i guarda l'arxiu de dades (paquet del TFC ) al
     * repositori.
     * @return
     */

    public String editarForm(){
        String stat=Config.CORRECTE;
        GestorContenidors gc=null;
        GestorArxiuDades gad=null;
        GestorMetadades gmd=null;
        if (this.getIdContenidorActual()==null ||
                this.getIdContenidorActual()<0 ){
            this.getLog().info("IGI:editarForm: Falta l'id del contenidor, per "
                    +"afegir un ítem");
            addActionError("IGI:editarForm: Falta l'ident. del contenidor");
            return ActionSupport.ERROR;
        }
        try {
            this.openGestor();

            gc= GestorContenidors.getInstance();
            gad=GestorArxiuDades.getInstance();
            gmd=GestorMetadades.getInstance();

            // tenim una insercio o modificacio ?
            if (this.getModel().getId()!=Config.valorNull){

                //MODIFICACIÓ
                addActionMessage("Modificació Ítem :"
                        +this.getModel().toString());

                Long  falla=giI.modificar(item);
                addActionMessage("Ítem modificat, id: "+this.getIdItemActual());
            }else{
                /* **************************
                INSERCIÓ
                */
                Long idItem=Config.valorNull;

                // Preparem el contenidor
                Contenidor cont=gc.llegir(getIdContenidorActual());

                //Es correcte el contenidor ?
                if (cont.getId().equals(Config.valorNull)) {
                    this.getLog().error("IGI:EditarFinal:Hi ha hagut un "
                        +"error obtenint el contenidor:");
                    stat=ActionSupport.ERROR;
                    this.addActionError("Ítem no afegit.");
                    this.closeGestor();
                    gmd.tancar();
                    gad.tancar();
                    gc.tancar();
                    return stat;
                }

                String[] mdForm = this.getDc()[0].split(",");
                String[] mdValors =this.getDcValor()[0].split(",");
                List<MetaDC> metesDC=new ArrayList<MetaDC>();
                MetaDC mdc=new MetaDC();
                Long index=Config.valorNull;
                //Cal recordar en fer Trim per eliminar els espais que
                //afegeix el formulari.

                int mida = mdForm.length;
                for (int i =0;i<mida;i++){
                   getLog().info("pos:"+i+", dc:"+mdForm[i]+", Valor:"+mdValors[i]);
                   try {
                       //S'obté l'id de la metadada per obtenir el JB
                       index=Long.parseLong(mdForm[i].trim());
                   }catch(Exception e){
                        getLog().error("IGI:EditForm: l'id DC no s'ha pogut "
                           +"a Long dc:"+mdForm[i]);
                   }
                   getLog().info("index:"+index);
                   if ((index!=null)&&(index>0)) {
                       mdc =gmd.llegir(index);
                       getModel().addMetaDC(mdc, mdValors[i]);
                       //16-01-2012:Emili:N-M:metesDC.add(mdc);

                   }
                   else getLog().error("IGI:EditForm: El valor de l'index " 
                           +"passat és incorrecte o null\n. Valor a convertir:"
                           +mdForm[i]);
                }

                //Afegim les metadades a l'ítem
                //16-01-2012:Emili:N-M:if (metesDC.size()>0) getModel().setMetesDC(metesDC);

                
  /*           //Preparem la llista de MetaDades de l'ítem
                List<MetaDC> metesDC=new ArrayList<MetaDC>();
                int mida = this.getDc().length;
                while (mida >0 ){
                    Long index=Long.getLong(this.getDc()[mida-1]);
                    getLog().info("id:");
                    MetaDC metadc=gmd.llegir(index);
                    metesDC.add(metadc);
                    mida--;
                }
                //S'assigna la llista de metadades a l'ítem
                getModel().setMetesDC(metesDC);
*/
                //Nombre de visites a zero
                getModel().setVisites(0);

                //Data de publicació
                getModel().setDatapub(new Date());

                //Actualitzo les dades de l'arxiu de l'ítem
                getModel().setArxiu(gad.getEntitat());

                //s'assigna el contenidor a l'ítem
                getModel().setContenidor(cont);

                //Es guarda l'arxiu de dades
                gad.inicialitzar(this.getArxiuDades());
                gad.generarArxiu(this.getArxiuDadesFileName()
                        , this.getArxiuDadesContentType());

                //S'ha guardat ?
                if (gad.getEntitat().getNom().equals(Config.valorNullStr)) {
                    this.getLog().error("IGI:EditarFinal:Hi ha hagut un "
                        +"error guardant l'arxiu de dades:");
                    stat=ActionSupport.ERROR;
                    this.addActionError("Ítem no afegit.");
                    this.closeGestor();
                    gmd.tancar();
                    gad.tancar();
                    gc.tancar();
                    return stat;
                }
                /*TODO: Emili: 16:01-2012:  Caldrà realitzar aquesta operació
                 *      des de GI i cas que no es pugui ubicar caldrà eliminar
                 *      o no guardar, l'ítem.
                 */
                //Finalment es mou l'arxiu de dades a l'ubicació final.
                //Actualitzem l'ítem amb les noves dades de l'arxiu
                if (gad.UbicarArxiu())
                    this.getModel().setArxiu(gad.getEntitat());

                //Fem persistent l'ítem
                idItem=giI.afegir(this.getModel());
                //Tenim un ident. correcte?
                //getLog().error("IGI:EditForm: després d'afegir: "+metesDC.get(0).getNom());
                if (idItem <0 ){
                    this.getLog().error("IGI:EditarFinal:Hi ha hagut un "
                               +"error afegint l'ítem. valor retornat:"+idItem);
                    stat=ActionSupport.ERROR;
                    this.addActionError("Ítem no afegit.");
                }else{
                    addActionMessage("Afegir Ítem nou:"
                        +this.getModel().toString());
                    addActionMessage("Ítem afegit, id: " +idItem.toString());

                    /*
                    gad.UbicarArxiu();
                    Arxiu arxi=new Arxiu();
                    arxi.setMida(gad.getEntitat().getMida());
                    arxi.setNom(gad.getEntitat().getNom());
                    arxi.setTipus(gad.getEntitat().getTipus());
                    arxi.setUbicacio(gad.getEntitat().getUbicacio());

                    //Actualitzem l'ítem amb les noves dades de l'arxiu
                    this.getModel().setArxiu(gad.getEntitat());*/
                    getLog().info("Valor de l'entitat: "
                            +getModel().getArxiu().toString());
                    giI.modificar(this.getModel());
                    }

                }
            }catch (AfegirDAOException ex) {
                this.getLog().error("IGI:EditForm:La base de dades informa d'un"
                  +" error en l'entrada de l'ítem. "+ex.getLocalizedMessage());
                this.addActionError("Ítem no afegit. Problemes amb l'accés a"
                        +" dades.");
                stat=ActionSupport.ERROR;

            }catch (ModDAOException ex) {
                this.getLog().error("IGI:EditForm:Hi ha hagut un error "
                        +"realitzant la modificació de l'ítem"
                        +ex.getLocalizedMessage());
                this.addActionError("IGI:EditForm:Item buit o error en la " +
                        "modificació");
                stat=ActionSupport.ERROR;

            }catch (NullPointerException e){
                this.getLog().error("IGI:EditForm:Valor null trobat "
                        +e.getMessage());
                this.addActionError("s'ha provat d'utilitzar un valor null");
                stat=ActionSupport.ERROR;

            }catch (LlegirDAOException e){
                this.getLog().error("IGI:EditForm:Error llegint Contenidor "
                        +e.getMessage());
                this.addActionError("Error llegint Cotenidor, id:"
                        +getIdContenidorActual());
                stat=ActionSupport.ERROR;
            }catch (NoExisteixException e){
                this.getLog().error("IGI:EditForm:Error llegint Contenidor "
                        +e.getMessage());
                this.addActionError("Error llegint Cotenidor, id:"
                        +getIdContenidorActual());
                stat=ActionSupport.ERROR;
            }/*finally{
                    gmd.tancar();
                    gad.tancar();
                    gc.tancar();
                    this.closeGestor();
            }*/
        return stat;
    }

    /**
     * Mètode per afegir arxius de dades retorna error si no s'ha pogut fer
     * l'entrada i es netejen les dades de l'item entrades.
     * Retorna Succes si tot correcte
     * @return
     */
    private String afegirArxiu() {
        String stat=Config.CORRECTE;
        if (this.getIdContenidorActual()==null ||
                this.getIdContenidorActual()==Config.valorNull ){
            this.getLog().info("IGI:afegirArxiu:Falta l'id del contenidor, "
                    + "per afegir un ítem");
            addActionError("Falta l'identificador del contenidor");
            return ActionSupport.ERROR;
        }

        if (this.arxiuDades!=null){
            GestorArxiuDades gad=new GestorArxiuDades(this.getArxiuDades());
            try{

                /* Un cop es disposa de l'arxiu de dades es passa al Gestor per
                 * a que el guardi al directori que toqui.
                 */
                gad.generarArxiu(this.getArxiuDadesFileName(),
                                 this.getArxiuDadesContentType());

                arxiu=gad.getEntitat();
                this.getLog().info("IGI:afegirArxiu:arxiu generat:"
                        +arxiu.toString());


                //itemDades=new Item(Config.valorNullStr,new Date(),
                //            Config.valorNullStr,false,null,arxiu);
                item.setArxiu(arxiu);
                

            }catch (NullPointerException e){
                this.getLog().error("IGI:afegirArxiu:Un dels valors tractats "
                        + "és null. Possiblement sigui l`ítem");
                this.addActionError("Un dels valors tractats és null.");
                stat=ActionSupport.ERROR;
                ressetejarDades(gad);

            }catch (HibernateException e){
                this.getLog().error("IGI:afegirArxiu:Error d'accés a les dades "
                        +" id:"+this.getIdItemActual()+". Error:"
                        +e.getLocalizedMessage());
                this.addActionError("Error accedint a l`ítem.");
                stat=ActionSupport.ERROR;
                ressetejarDades(gad);
            }finally{
                gad=null;
            }
        }
          else stat=ActionSupport.INPUT;


        return stat;
    }

    private void ressetejarDades(GestorArxiuDades gad){
                //Es comprova si s'ha arrivat a guardar algun arxiu
                if (item!=null )  {
                    if (item.getArxiu()!=null){
                        gad.inicialitzar(arxiu);
                        gad.eliminarArxiu();

                    }
                }
    }

    public String topten(){

        List<ItemLlistat> llistaI=new ArrayList<ItemLlistat>();
        
        try{
            openGestor();
            Iterator<Item> ll=giI.llistaTopTen();

             while (ll.hasNext()){
                Item i=(Item)ll.next();
                //Es delimita la llista per la paginació
                //if (punter >=ini && punter <=fi)
                //this.getLog().error("visites: "+i.getNom()+", "+i.getVisites());
                
                llistaI.add(new ItemLlistat(i.getId(),i.getNom(),i.getDatapub()
                        ,i.getAutor(),i.getVisites(),i.getArxiu().getTipus()
                        ,i.getContenidor().getNom(), i.getPrivat()) );
                //punter++;
            }
            this.setLlistaIt(llistaI);
            ll=null;
        }catch(NullPointerException e){
            this.getLog().error("llista top ten buida d`ítems. {}",
                    e.getLocalizedMessage());
        }catch(LlistatDAOException e){
            this.getLog().error("llista top ten d`ítems buida. {}",
                    e.getLocalizedMessage());
        }catch(HibernateException e){
            this.getLog().error("Error obtenint el top ten d`ítems. {}",
                    e.getLocalizedMessage());
        }

      if (giI!=null) {
            giI.tancar();
            giI=null;
      }
        return ActionSupport.SUCCESS;
    }

    public String llistat(){
        //Contenidor co=null;
        //Iterator<Item> ll;
        //GestorItems gi =new GestorItems();
        //int numItems=Config.valorNullInt;

        try {
            this.openGestor();
            //Obtenir la llista d'ítems
           // ll=gi.llistatItems();

            //S'indica el número d'ítems del contenidor per fer la paginació
            this.setNItems(giI.numItems());
            if (!comprovarLimits(this.getPos(),0,this.getNItems())) {
                this.addActionError("Límits de posició fora de rang");
                return ActionSupport.ERROR;
            }

            this.setLlistaIt( this.omplirLlistaItems(giI,this.getPos(),
                    (this.getPos()+this.getItemsPerPagina())));

            // S'emplena la llista de contenidors per poder afegir un ítem
            this.omplirllistatContenidors();
            
        }catch(NullPointerException e){
            this.getLog().error("IGI:llistat: Error obtenint la llista d`Ítems."
                    +e.getLocalizedMessage());
        }catch(BuitException e){
            this.getLog().error("IGI: llista d`Ítems buida."
                    +e.getLocalizedMessage());
        }
        return ActionSupport.SUCCESS;
    }

    private List<ItemLlistat> omplirLlistaItems(GestorItems gi,int ini, int fi){

        Iterator <Item> ll=null;
        List<ItemLlistat> llistaI = new ArrayList<ItemLlistat>();
        //GestorItems gi =new GestorItems();

        try {
            //Comprovació de rangs
            if (ini < 0) ini=0;
            //5-12-11 if (fi +1>= this.getQuants()) fi=this.getQuants();

            ll=gi.llistat(ini, fi);
            while (ll.hasNext()){
                Item i=(Item)ll.next();
                //Es delimita la llista per la paginació
                //if (punter >=ini && punter <=fi)
                //this.getLog().error("visites: "+i.getNom()+", "+i.getVisites());

                llistaI.add(new ItemLlistat(i.getId(),i.getNom(),i.getDatapub()
                        ,i.getAutor(),i.getVisites(),i.getArxiu().getTipus()
                        ,i.getContenidor().getNom(), i.getPrivat()) );
                //punter++;
            }
        }catch (HibernateException ex) {
                this.getLog().error("no s'ha pogut obtenir els d'Ítems",
                        ex.getLocalizedMessage());

        }catch (NullPointerException ex) {
                this.getLog().error("Error: Llistat d'Ítems. Alguns valors són null.{}"
                        ,ex.getLocalizedMessage());
        }catch (IndexOutOfBoundsException ex) {
                this.getLog().error("Error: La llista d'ítems es troba fora de rang.{} "
                        ,ex.getLocalizedMessage());
        }catch(LlistatDAOException e){
            this.getLog().error("Error obtenint la llista d`Ítems. {}",
                    e.getLocalizedMessage());
        }//finally{
             //   gc.tancar();
            //}

        ll=null;

        //}
        return llistaI;
    }
    private void omplirllistatContenidors(){
        Iterator<Contenidor> ll;

        try {
            GestorContenidors gcI = GestorContenidors.getInstance();
            //Obtenir la llista de grups
            ll=gcI.llistat();
            this.setLlistaContenidors(ll);
            ll=null;
            gcI.tancar();

        }catch(NullPointerException e){
            this.getLog().error("IGI:ompllistContenidors:obtenint la llista de "
                    +"conteidors."+e.getLocalizedMessage());
        }/*catch(BuitException e){
            this.getLog().error("IGI:ompLlistaCont:llista buida "
                    +"de contenidors."+e.getLocalizedMessage());
        }*/catch(LlistatDAOException e){
            this.getLog().error("IGI:ompllistaCont:Error d`accés a la llista "
                    +"de conteidors."+e.getLocalizedMessage());
        }
    }

    private void omplirllistatDC(){
        Iterator<MetaDC> ll;

        try {
            GestorMetadades gmd = GestorMetadades.getInstance();
            //Obtenir la llista de MetaDCs
            ll=gmd.llistat();
            this.setLlistaDC(ll);
            ll=null;
            //gmd.tancar();

        }catch(NullPointerException e){
            this.getLog().error("IGI:omplirLlistatDC:llista nul.la de MetaDC. "
                    +e.getLocalizedMessage());
        }catch(BuitException e){
            this.getLog().error("IGI:omplirLlistatDC: llista buida de MetaDC. "
                    +e.getLocalizedMessage());
        }catch(LlistatDAOException e){
            this.getLog().error("IGI:omplirLlistatDC:Error d`accés a la llista"
                    +"de MetaDC. "+e.getLocalizedMessage());
        }
    }



 /*   @Deprecated
    public void llistaContenidors(){
        Iterator<Contenidor> ll;
        List<ContenidorLlistat> llistaC=new ArrayList<ContenidorLlistat>();

        try {
            GestorContenidors gc = GestorContenidors.getInstance();
            //Obtenir la llista dde contenidors
            ll=gc.llistatContenidors();
            while (ll.hasNext()){
                Contenidor co=(Contenidor)ll.next();

                llistaC.add(new ContenidorLlistat(co.getId(),co.getNom(),
                        co.getDatapub(),Config.valorNullInt));
                //punter++;
            }
            //S'emplena la llista llistaCon de contenidors
            this.setLlistaContenidors(llistaC);
            ll=null;

            gc.tancar();
            gc=null;

        }catch(NullPointerException e){
            this.getLog().error("Error obtenint la llista de contenidors. {}"
                    ,e.getLocalizedMessage());
        }catch(LlistatDAOException e){
            this.getLog().error("Error d`accés a la llista de contenidors. {}"
                    ,e.getLocalizedMessage());
        }       
    }
*/


    /** Per preparar els objectes Arxiu partint dels paràmetres nomArxiu rebut
     */
/*
 *          DESACTIVAT FINS A IMPLEMENTAR TOT EL GESTOR D'ARXIUS
 */
    
    /**    private void generarArxius(){
        // Es comprova si tenim un arxiu per identificar
        // l'ítem
        GestorArxiuDades gad=null;

        try{
            if (!this.getNomArxiu().equals("") &&
                !this.getNomArxiu().equals(Config.valorNullStr)){

                gad = new GestorArxiuDades();
                File f = new File(Config.rutaFitxers+"/"+this.getNomArxiu());
                gad.inicialitzar(f);
                if (gad.Exists()){

                    //Hi ha arxiu de dades
                    this.setArxiu(gad.getEntitat());

                    }
                }
                gad=null;
            }
        }catch(NullPointerException e){
            this.getLog().error("Valor null generant els arxius per l`ítem.{}",
                    e.getLocalizedMessage());
            gad=null;
        }
    }
*/
    /**
     *  Mètode per editar/Afegir un ítem
     * @return
     */


    /*
     *  DESACTIVAT FINS A L'ACTIVACIÓ DELS GESTOR D'ARXIUS
     * NO ES PODEN FER ADDICIONS NI MODIFICACIONS
     */
    /*
    public String editarForm(){
     String stat=Config.CORRECTE;
     //this.openGestor();
     GestorItems gi = new GestorItems();
     try {
        addActionMessage("editarForm:"+this.getContenidor().toString());


        // tenim una insercio o modificacio ?
        //modificació

        if (this.getItem()!=null ){
            this.getLog().info("dintre:",this.getIdItemActual().toString());
            this.getLog().info("Dades:",this.getItem().toString());
            this.getLog().info("Contenidor:",this.getItem().getContenidor().toString());
            gi.modificarItem(this.getItem());

            addActionMessage("Ítem modificat, id: "+this.getIdItemActual());
            item=null;
        
        //insercio Nova,
        }else {
            //item.setContenidor(contenidor);
            // desconnectat per a fer proves - Long idItm=gi.afegirItem(item);
            //addActionMessage("Ítem afegit, id: " +idItm.toString());
            this.generarArxius();

            addActionMessage("arxiu:"+this.getArxiu().toString());
            addActionMessage("
            if(this.getArxiu()!=null){
                addActionMessage(":3:");
                    item= new Item(item.getNom(),item.getDataPub(),
                            item.getDescripcio(),item.isPrivat(),0,
                            item.getAutor(),null,this.getArxiu());
                    this.getLog().info("dintre 4");
                }else{
                    logexuoc.error("No es disposa de cap arxiu de dades vàlid.");
                    if (gi!=null){
                        gi.tancar();
                        gi=null;
                    }
                    return ActionSupport.ERROR;
                }
        addActionMessage("item:"+this.getItem().toString());

            item.setContenidor(new Contenidor());
            this.getLog().info("item:"+item.toString());
            this.getLog().info("Arxiu:"+this.arxiu.toString());
                
            if (this.getContenidor()==null) {
                    //Tenim un ítem sense contenidor
                    //TODO: 16:01:11:Emili:Caldria eliminar l'arxiu de dades
                    addActionError("No es pot afegir l'ítem:");
                    addActionError("L'ítem no disposa de contenidor.");
                    if (gi!=null){
                        gi.tancar();
                        gi=null;
                    }
                    return ActionSupport.ERROR;
            }
            
            
                //Tenim un ítem 
                Item itm = new Item( getItem().getNom(), getItem().getDataPub(),
                         getItem().getDescripcio(), getItem().isPrivat(), 0,
                         getItem().getAutor(), getContenidor(),getArxiu());
                Long idItm=-1L;//gi.afegirItem(itm);
                addActionMessage("Ítem afegit, id: " +idItm.toString());
                addActionMessage(itm.toString());
            

            this.getLog().info(item.toString());
        }

        stat=Config.CORRECTE;
        
     }catch (ModDAOException ex) {
            logexuoc.error("Hi ha hagut un error realitzant la modificació de `ítem.{} "
                    , ex.getLocalizedMessage());
            stat=ActionSupport.ERROR;

     }catch (NullPointerException e){
            logexuoc.error("Valor null trobat a afegint un ítem. {}", e.getLocalizedMessage());
            stat=ActionSupport.ERROR;
     }finally{
        if (gi!=null){
            gi.tancar();
            gi=null;
        }
     }
     return stat;
    }

    public String eliminar(){
        String stat=ActionSupport.ERROR;
        //this.openGestor();
        GestorItems gi = new GestorItems();

        this.getLog().info("Contenidor: "+this.getContenidor());
        this.getLog().info("Item: "+this.getItem());
        this.getLog().info("idContenidor: "+this.getIdContenidorActual());
        this.getLog().info("idItem: "+this.getIdItemActual());

        if (this.getIdContenidorActual()!=null && this.getIdItemActual()!=null){

            stat=Config.CORRECTE;
            try{

                //gi.eliminarItem(this.getItem(),this.getContenidor());
                gi.eliminarItem(this.getIdItemActual(),this.getIdContenidorActual());
                addActionMessage("Item eliminat : " +this.getItem().getNom());
                addActionMessage("Contenidor: " +this.getContenidor().getNom());
               // this.setContenidor(null);
               // this.setItem(null);

            }catch (EliDAOException e){
                this.getLog().error("S'ha produit un error eliminant l'ítem. {}"
                        ,e.getMessage());
                this.addActionError("Item no eliminat, id:"+this.getIdItemActual());
                this.addActionError(e.getMessage());
                stat=ActionSupport.ERROR;

            }catch (IllegalArgumentException e){
                this.getLog().error("El paràmetre indicat no és correcte: "+
                        this.getIdItemActual()+". {}", e.getMessage());
                this.addActionError("Ítem no eliminat, id:"+this.getIdItemActual());
                this.addActionError(e.getMessage());
                stat=ActionSupport.ERROR;

            }catch (NullPointerException e){
                logexuoc.error("Valor null trobat.{} ", e.getLocalizedMessage());
                this.addActionError("Item no eliminat, id:"+this.getIdItemActual());
                this.addActionError(e.getMessage());
                stat=ActionSupport.ERROR;
            }finally{
                if (gi!=null){
                    gi.tancar();
                    gi=null;
                }
            }
        }
        //this.closeGestor();
      //  gi.tancar();
        return stat;
    }

*/
    /**
     * Mètode d'accés a la pàgina de consutla de l'ítem
     * @return Success
     */
    public String consulta(){
        //14-01-11 Item it=null;
        InterfaceItem it=null;
        this.openGestor();
        //GestorItems gi = new GestorItems();
/*Emili :05-01-02012:        if (gi !=null)
            getLog().info("Consulta:GI:");
        else
            getLog().info("Consulta:NOOOO GI:");
 *
 */
        try {

            //Obtenir dades del contenidor
            getLog().info("IGI:Consulta:IdItemActual:"+this.getIdItemActual());
            it=giI.llegir(this.getIdItemActual());
            getLog().info("IGI:Consulta:Nom:"+it.getNom());
            this.setNItems(giI.numItems());
            getLog().info("Consulta:quants:"+this.getNItems());
            giI.mesVisita(this.getIdItemActual());
            getLog().info("Consulta:mesVista:");
        }catch(NullPointerException e){
            this.getLog().error("IGI:consulta:Error obtenint la llista d`Ítems."
                    +e.getLocalizedMessage());

        }/*catch (LlegirDAOException ex) {
                this.getLog().error("IGI:consulta:No existeix l'ítem."
                        +ex.getLocalizedMessage());

        }*/catch (BuitException ex) {
                this.getLog().error("IGI:consulta:L'ítem és null."
                        +ex.getLocalizedMessage());

        }catch (LlegirDAOException ex) {
                this.getLog().error("IGI:consulta:Error de lectura de l'ítem."
                        +ex.getLocalizedMessage());

        }
        
        return ActionSupport.SUCCESS;
    }

    public int quants(){
        int num=Config.valorNullInt;
        //GestorItems gi =new GestorItems();
        try {
            openGestor();
            num = giI.numItems();
        } catch (HibernateException ex) {
            this.getLog().error("IGI:quants: no s'ha pogut obtenir el nombre "
                    +"d'ítems"+ ex.getLocalizedMessage());
            num=0;
        } catch (BuitException ex) {
            this.getLog().error("IGI:quants: nombre d'ítems incorrecte."
                    +ex.getLocalizedMessage());
            num=0;
        }catch (NullPointerException ex) {
            this.getLog().error("IGI:quants: S'ha reotrnat un null."
                    +ex.getLocalizedMessage());
            num=0;
        }
        return num;
    }

    /**
     *      TESTS
     */

    public void testAfegirItem(){
        openGestor();
        Arxiu arxiu = new Arxiu("arxiu,jpg","jpg",Config.rutaFitxers,133);
        Contenidor cont=null;
        InterfaceItem itm = new Item("emili11",new java.util.Date(),"descrip",
                true,0,"Autor nou",cont,arxiu);
        InterfaceItem itm2=null;

        Long id=Config.valorNull;
        GestorContenidors gc= GestorContenidors.getInstance();
        try {
            cont = gc.llegirContenidor(2L);
            itm.setContenidor(cont);
            giI.afegir(itm);
            cont.addItem(itm);
            id=itm.getId();
            cont=null;
            itm=null;

           // gc.tancar();
           // this.openGestor();
            if (id!=null){
                //legir-lo
                itm2 = giI.llegir(id);
                Eines.escriu("Valor llegit: "+itm2);

            }

        gc.tancar();
        giI.tancar();
        } catch (LlegirDAOException ex) {
            Logger.getLogger(IGestorItems.class.getName()).log(Level.SEVERE, null, ex);
            if (gc!=null) gc.tancar();
        }catch (NullPointerException ex) {
            Logger.getLogger(IGestorItems.class.getName()).log(Level.SEVERE, null, ex);
            if (gc!=null) gc.tancar();
        }catch (AfegirDAOException ex) {
            Logger.getLogger(IGestorItems.class.getName()).log(Level.SEVERE, null, ex);
            if (gc!=null) gc.tancar();
        }
    }


public void testEliminarItem(){
        openGestor();
        Contenidor cont=null;
        InterfaceItem itm = null;
        InterfaceItem itm2=null;

        Long idi=Config.valorNull;
        Long idc=Config.valorNull;

        GestorContenidors gc= GestorContenidors.getInstance();
        try {
            idc=2L;
            idi=16L;
            Long id=giI.eliminar(idi, idc);
            if (id!=null){
                //legir-lo
                itm2 = giI.llegir(id);
                Eines.escriu("Valor llegit: "+itm2);

            }

        } catch (LlegirDAOException ex) {
            Logger.getLogger(IGestorItems.class.getName()).log(Level.SEVERE, null, ex);
            if (gc!=null) gc.tancar();
        }catch (NullPointerException ex) {
            Logger.getLogger(IGestorItems.class.getName()).log(Level.SEVERE, null, ex);
            if (gc!=null) gc.tancar();
        } catch (EliDAOException ex) {
            Logger.getLogger(IGestorItems.class.getName()).log(Level.SEVERE, null, ex);
            if (gc!=null) gc.tancar();
        }
        gc.tancar();
           giI.tancar();
    }

    public static void main(String[] args){
        IGestorItems igi=new IGestorItems();
        //igi.openGestor();

        int i=0;

        //igi.afegirItem2();
       //Eines.escriu( igi.consultaItem());
        //Eines.escriu(igi.obtenirId("2"));
        //igi.consulta(12L);
       // igi.testAfegirItem();

       igi.openGestor();
        Iterator<Item> li=null;
        try {
            //li=(Iterator<ItemLlistat>) igi.omplirLlistaItems(0, 12).iterator();
            li =igi.giI.llistat(0,12);// giI.llistat(0, 12);
        } catch (LlistatDAOException ex) {
            Logger.getLogger(IGestorItems.class.getName()).log(Level.SEVERE, null, ex);
        }
        while (li.hasNext()){
            Eines.escriu(((Item)li.next()).toString());
        }
        igi.closeGestor();
        
        igi=null;

    }
}
